/*
 * String.h
 *
 *  Created on: 2020年12月2日
 *      Author: san
 */

#ifndef STRING_H_
#define STRING_H_

#include <cstring>
#include <memory>
#include <iostream>
#include <algorithm>

class String {
public:

	// 构造函数和析构函数
	String(): begin(nullptr), end(nullptr) { };
	String(const char *);
	String(const String &);
	// 移动构造函数
	String(String &&) noexcept;
	virtual ~String();

	// 重载输出运算符
	friend std::ostream &operator <<(std::ostream &, const String &);

	String &operator=(const String &);
	String &operator=(String &&) noexcept;

	std::size_t size() { return end - begin; }
	void print() { std::for_each(begin, end, [](const char c){ std::cout << c;}); }

private:
	static std::allocator<char> alloc;  // 这里是数据类型不是指针类型

	void free();
	std::pair<char *, char *> alloc_n_copy(const char *beg, const char *end);
	char *begin;
	char *end;
};

#endif /* STRING_H_ */
